# -*- coding: utf-8 -*-
# Python中默认的编码格式是 ASCII 格式，在没修改编码格式时无法正确打印汉字，所以在读取中文时会报错。

# 定义Singleton类，对其他类进行装饰 该类就是单例


# 对于系统中的某些类来说，只有一个实例很重要，例如，一个系统中可以存在多个打印任务，但是只能有一个正在工作的任务；一个系统只能有一个窗口管理器或文件系统；
# 一个系统只能有一个计时工具或id(序号)生成器。如在windows中就只能打开一个任务管理器。
# 如果不使用机制对窗口对象进行唯一化，将弹出多个窗口，如果这些窗口显示的内容完全一致，则是重复对象，浪费内存资源；
# 如果这些窗口显示的内容不一致，则意味着在某一瞬间系统有多个状态，与实际不符，也会给用户带来误解，不知道哪一个才是真实的状态。
# 因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。


def singleton(cls):
    _instance = {}

    print(cls)

    def _singleton(*args, **kargs):
        if cls not in _instance:                            # 如果没有就创建一个cls
            _instance[cls] = cls(*args, **kargs)            # 如果有了就返回
        return _instance[cls]

    return _singleton


@singleton
class A(object):
    a = 1

    def __init__(self, x=0):
        self.x = x


a1 = A(2)
a2 = A(3)
a1.a = 4
a2.a = 5
print(a1.a)         # 输出5
print(a2.a)         # 输出5
